//package com.example.springbootjpa.repository;
//
//import org.springframework.beans.BeanUtils;
//import org.springframework.beans.BeanWrapper;
//import org.springframework.beans.BeanWrapperImpl;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.data.jpa.repository.support.JpaEntityInformation;
//import org.springframework.data.jpa.repository.support.SimpleJpaRepository;
//import org.springframework.util.StringUtils;
//
//import javax.persistence.EntityManager;
//import javax.transaction.Transactional;
//import java.beans.PropertyDescriptor;
//import java.util.HashSet;
//import java.util.Set;
//
//@SuppressWarnings(value = "all")
//public class JpaRepositoryReBuild<T, ID> extends SimpleJpaRepository<T, ID> {
//
//    private final JpaEntityInformation<T, ?> entityInformation;
//    private final EntityManager em;
//
//    @Autowired
//    public JpaRepositoryReBuild(
//            JpaEntityInformation<T, ?> entityInformation, EntityManager entityManager) {
//        super(entityInformation, entityManager);
//        this.entityInformation = entityInformation;
//        this.em = entityManager;
//    }
//
//    /**
//     * 通用save方法 ：新增/选择性更新
//     */
//    @Override
//    @Transactional
//    public <S extends T> S save(S entity) {
//
//        // 获取ID
//        ID entityId = (ID) this.entityInformation.getId(entity);
//        T managedEntity;
//        T mergedEntity;
//        if (entityId == null) {
//            em.persist(entity);
//            mergedEntity = entity;
//        } else {
//            managedEntity = this.findById(entityId).get();
//            if (managedEntity == null) {
//                em.persist(entity);
//                mergedEntity = entity;
//            } else {
//                BeanUtils.copyProperties(entity, managedEntity, getNullProperties(entity));
//                em.merge(managedEntity);
//                mergedEntity = managedEntity;
//            }
//        }
//        return entity;
//    }
//
//    /**
//     * 获取对象的空属性
//     */
//    private static String[] getNullProperties(Object src) {
//        // 1.获取Bean
//        BeanWrapper srcBean = new BeanWrapperImpl(src);
//        // 2.获取Bean的属性描述
//        PropertyDescriptor[] pds = srcBean.getPropertyDescriptors();
//        // 3.获取Bean的空属性
//        Set<String> properties = new HashSet<>();
//        for (PropertyDescriptor propertyDescriptor : pds) {
//            String propertyName = propertyDescriptor.getName();
//            Object propertyValue = srcBean.getPropertyValue(propertyName);
//            if (StringUtils.isEmpty(propertyValue)) {
//                srcBean.setPropertyValue(propertyName, null);
//                properties.add(propertyName);
//            }
//        }
//        return properties.toArray(new String[0]);
//    }
//}